home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 098 / parint.lbr / parint.asm next >
Assembly Source File  |  2011-02-02  |  7KB  |  200 lines

  1. comment * parint.asm - (c) David G. Hunter
  2.                         keyed by Howard Ekman
  3.                         Terrapin Station 612 623 1156
  4.           This program may be freely copied but not sold for profit.
  5.           PARINT.COM detects parity errors, logs them on the printer if
  6.           possible, beeps, and returns to program execution.  The system does
  7.           not halt when this program is resident. Parity error checking is
  8.           supressed after the first parity error is detected.  The error
  9.           message includes the time of the event.  If the printer is not
  10.           available, the errors are logged to the screen.
  11.  
  12. *
  13. ;*******************    Address of Interupt Handlers    *********************
  14.  
  15. Book      segment at 0h      ; This is where the interrupt address book is
  16.           org      2h*4      ;
  17. Int_2     label    dword     ; Address of NMI handler
  18. Book      ends
  19.  
  20. ;*****************      Beginning of Parint Instructions    ******************
  21. cseg      segment
  22.           assume cs:cseg
  23.           org 100h
  24.  
  25. start:    jmp newvec         ; install new NMI handler in RAM
  26.  
  27. ;***************************    NMI handler   ******************************
  28.  
  29. newint    proc     near      ; New interrupt handler
  30.           assume ds:cseg, es:cseg
  31.           sti                ; This flag was cleared when interrupt was issued
  32.           jmp go             ; Jump over more data
  33.  
  34. ;****************************      D A T A     ******************************
  35.  
  36. GetOut:   nop
  37. Instruc   db       0EAh
  38. Oldint    dd
  39. Device1   dw       0004
  40. Device2   dw       0001
  41. par1      db       0Dh,0Ah,"Parity Error: Main Board     ",07h,0Dh,0Ah
  42. par2      db       0Dh,0Ah,"Parity Error: Expansion Board",07h,0Dh,0Ah
  43. time      db       "    TIME:  "
  44. hour      dw       "00"
  45.           db       ":"
  46. min       dw       "00"
  47.           db       "                ",0Dh,0Ah
  48. paroff    db       "PARITY CHECKING NOW DISABLED   ",0dH,0Ah,0Ah
  49. go:       push     cx
  50.           push     ds
  51.           pushf
  52.           push     dx
  53.           push     bx
  54.           push     ax
  55.           pushf
  56.           mov      al,00h         ; Turn off parity checking for now
  57.           out      0A0h,al        ; CX = error flag: CX = 1 if parity OK
  58.           xor      cx,cx          ; get data in port C
  59.  
  60. ; - - - - - -     Find origin of NMI     - - - - - - -
  61.           in       al,62h
  62.           test     al,40h
  63.           jz       mother
  64.           mov      dx,offset par2 ; If bit 6 is set, error is on expansion board
  65.           jmp      out      ; print message and exit
  66.  
  67. mother:   test     al,80h
  68.           jz       other
  69.           mov      dx,offset par1 ; If bit 7 is set, error on main board
  70.           jmp      out      ; print message and exit
  71.  
  72. other:    or       cx,1h    ; If neither bit is set, no parity error occurred
  73.           mov      al,80h   ; So set parity flag OK,
  74.           out      0A0h,al  ; Turn parity checking back on.
  75.           jmp      noprt    ; Dont print message if no parity error
  76.  
  77. ;- -   Print error messages and exit, Type of exit depends on error   - - - - -
  78. out:      mov      ax,cs    ; Establish proper data segment to
  79.           mov      ds,ax    ;   allow access to message
  80.           call     whatime  ; Get time of error
  81.           mov      bx,device1
  82.           cmp      bx,0004  ; If output is to printer, make sure it's ready
  83.           jne      f1
  84.           call     testprt
  85. f1:       call     print
  86.           mov      dx,offset time ; Time of error message
  87.           call     print
  88.           mov      dx,offset paroff
  89.           call     print
  90.  
  91. noprt:    popf
  92.           pop      ax
  93.           pop      bx
  94.           pop      dx
  95.           popf
  96.           pop      ds
  97.           test     cx,1h    ; special exit if parity OK.
  98.           jnz      oth
  99.           pop      cx       ; Message printed, continue other program continue
  100.           iret
  101.  
  102. ;    If no parity error, turn control over to pre-exitsting NMI handler. This is
  103. ; done by restoring the DS registre and jmuping to the instruction  that specifi
  104. ; es the address of the old interrupt routine.  This unnusual exit is necessary
  105. ; because once the DS is restored the address of the old interrupt would be
  106. ; inaccessable.
  107.  
  108. oth:      cli
  109.           pop      cx
  110.           jmp      GetOut
  111.  
  112. newint    endp
  113.  
  114.  
  115. ;**************      Subroutines     ****************************
  116.  
  117. Testprt   proc     near
  118.           push     dx
  119.           push     ax
  120.           xor      dx,dx    ; pronter #0
  121.           mov      ah,2
  122.           int      17h      ; read printer status
  123.           test     ah,00101001b   ; error bits
  124.           jz       aok
  125.           mov      bx,device2 ; if not OK, try other device
  126. aok:      pop      ax
  127.           pop      dx
  128.           ret
  129. testprt   endp
  130.  
  131. Print     proc     near ; Ooutput to file named in BX, if error try another file
  132.           push     cx
  133.           mov      cx,34    ; 34 characters to print
  134.           mov      ah,40h   ; DOS function call
  135.           int      21h
  136.           pop      cx
  137.           ret
  138. print     endp
  139.  
  140. Whatime   proc     near     ; What time is it?  Put results in Hours/Minutes.
  141.           push     cx
  142.           push     dx
  143.           mov      ah,2Ch   ; DOS time
  144.           int      21h
  145.           mov      al,ch    ; hours (0-23)
  146.           call     convt    ; Put tens in AH, ones in AL
  147.           mov      hour,"00"
  148.           add      hour,ax
  149.           mov      al,cl
  150.           call     convt    ; Do the same for minutes
  151.           mov      min,"00"
  152.           add      min,ax
  153.           pop      dx
  154.           pop      cx
  155.           ret
  156. whatime endp
  157.  
  158. Convt     proc     near     ; convert number (<100) to ASCII. Number is in AL
  159.           xor      ah,ah       ; Result:  Tens in AH, ones in AL.
  160.           xor      ah,ah       ; input is less than 100 anyway - clear it.
  161.           push     cx
  162.           mov      cl,10
  163.           div      cl          ; divide by ten
  164.           pop      cx
  165. little:   ret
  166. convt     endp
  167.  
  168. ;*********************       Install NMI handler          ********************
  169.  
  170. Newvec    proc     near
  171.           jmp      past
  172.  
  173. loaded    db       0Dh,0Ah,"Parity Error Intercetor v2.00 "
  174.           db       "by David Hunter IS NOW"
  175.           db       " INSTALLED",0Dh,0Ah,"$"
  176.  
  177. past:     mov      dx, offset loaded
  178.           mov      ah,9
  179.           int      21h
  180.           assume   ds:Book     ; interrupt address book area
  181.           push     ds          ; save old DS for future use.
  182.           mov      ax,Book
  183.           mov      ds,ax
  184.           mov      al,00h
  185.           out      0A0h,al     ; turn off parity checking
  186.           mov      ax,int_2    ; get the address
  187.           mov      oldint,ax   ; save it for some future use
  188.           mov      ax,int_2[2] ; second part of double word
  189.           mov      oldint[2],ax
  190.           mov      int_2, offset newint ; now load the new address
  191.           mov      int_2[2],cs ; CS is DS in .COM program
  192.           mov      al,80h
  193.           out      0A0h,al     ; turn parity checking back on
  194.           mov      dx, offset newvec   ; leave new interrupt routine resident
  195.           int      27h         ; don't need NEWVEC or beyond
  196. newvec    endp
  197. cseg      ends
  198.           end      start
  199.  
  200.